package ve.usb.coord.colision;

import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import ve.usb.cohesion.runtime.CohesionAction;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import ve.usb.coord.colision.hibernate.*;

import java.security.*;
import java.lang.String.*;

import   javax.crypto.*;
import   javax.crypto.interfaces.*;
import   javax.crypto.spec.*;

/**
 * Manejo de elementos de la entidad Usuario.
 */
public class AccionesUsuario extends CohesionAction {
    
/**
     * Acción llamada por Struts para ejecutar la acción UsuarioCoordinacionCrearI.
     * Prepara la vista de captura de datos de una entidad para realizar una inserción.<br>
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward UsuarioCoordinacionCrearI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        //Salidas
        final String SALIDA_0 = "usuarioCoordinacionCrear";

        String salida = SALIDA_0;        
        Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            HttpSession sess = request.getSession();
            FUsuario fFUsuario = (FUsuario)sess.getAttribute("FUsuario");
            if (fFUsuario==null) {
                fFUsuario = new FUsuario();
                sess.setAttribute("FUsuario", fFUsuario);
            } else {
                fFUsuario.reset(mapping, request);
            }
             
            //Feed for combo listCoordinacion.
            {java.util.List<ve.usb.cohesion.runtime.Pair> list = 
               (java.util.List<ve.usb.cohesion.runtime.Pair>)s.createQuery(
               "select new ve.usb.cohesion.runtime.Pair(nombre, idCoordinacion) " + 
               "from Coordinacion").list();
             list.add(0,new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
             fFUsuario.setListCoordinacion(list);
            }

            fFUsuario.setCoordinacion(Long.parseLong((String)request.getParameter("idCoordinacion")));

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        }
        return mapping.findForward(salida);
    }

    /**
     * Acción llamada por Struts para ejecutar la acción UsuarioCoordinacionCrearI.
     * Prepara la vista de captura de datos de una entidad para realizar una inserción.<br>
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward UsuarioDepartamentoCrearI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        //Salidas
        final String SALIDA_0 = "usuarioDepartamentoCrear";

        String salida = SALIDA_0;        
        Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            HttpSession sess = request.getSession();
            FUsuario fFUsuario = (FUsuario)sess.getAttribute("FUsuario");
            if (fFUsuario==null) {
                fFUsuario = new FUsuario();
                sess.setAttribute("FUsuario", fFUsuario);
            } else {
                fFUsuario.reset(mapping, request);
            }
             
            //Feed for combo listdepamento.
            {java.util.List<ve.usb.cohesion.runtime.Pair> list = 
               (java.util.List<ve.usb.cohesion.runtime.Pair>)s.createQuery(
               "select new ve.usb.cohesion.runtime.Pair(nombre, idDepartamento) " + 
               "from Departamento").list();
             list.add(0,new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
             fFUsuario.setListDepartamento(list);
            }

            fFUsuario.setDepartamento(Long.parseLong((String)request.getParameter("idDepartamento")));

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        }
        return mapping.findForward(salida);
    }
    
/**
     * Acción llamada por Struts para ejecutar la acción UsuarioI.
     * Prepara la vista de actualización de una entidad.<br>
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward UsuarioI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        //Salidas
        final String SALIDA_0 = "usuario";

        String salida = SALIDA_0;        
        Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            String id = request.getParameter("idUsuario");
            Long idUsuario = (id.equalsIgnoreCase("0")) ? 
                (Long)request.getSession().getAttribute("idUsuario") :
                new Long(id);
            
            HttpSession sess = request.getSession();
            FUsuario fFUsuario = (FUsuario)sess.getAttribute("FUsuario");
            if (fFUsuario==null) {
                fFUsuario = new FUsuario();
                sess.setAttribute("FUsuario", fFUsuario);
            } else {
                fFUsuario.reset(mapping, request);
            }
            Usuario usuario = (Usuario)s.load(Usuario.class, idUsuario);
            fFUsuario.setIdUsuario(usuario.getIdUsuario());
            
            if(usuario.getCoordinacion() != null){
                fFUsuario.setCoordinacion(usuario.getCoordinacion().getIdCoordinacion());
                request.getSession().setAttribute("idCoordinacion", fFUsuario.getCoordinacion());
            }
            if(usuario.getDepartamento() != null){
                fFUsuario.setDepartamento(usuario.getDepartamento().getIdDepartamento());
                request.getSession().setAttribute("idDepartamento", fFUsuario.getDepartamento());
            }
            fFUsuario.setNombreUsuario(usuario.getNombreUsuario());
            fFUsuario.setContrasena("");
            fFUsuario.setTipoUsuario(usuario.getTipoUsuario());

            //Feed for combo listCoordinacion.
            {java.util.List<ve.usb.cohesion.runtime.Pair> list = 
               (java.util.List<ve.usb.cohesion.runtime.Pair>)s.createQuery(
               "select new ve.usb.cohesion.runtime.Pair(nombre, idCoordinacion) " + 
               "from Coordinacion").list();
             list.add(0,new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
             fFUsuario.setListCoordinacion(list);
            }          
            
            {java.util.List<ve.usb.cohesion.runtime.Pair> listD = 
               (java.util.List<ve.usb.cohesion.runtime.Pair>)s.createQuery(
               "select new ve.usb.cohesion.runtime.Pair(nombre, idDepartamento) " + 
               "from Departamento").list();
             listD.add(0,new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
             fFUsuario.setListDepartamento(listD);
            } 

            request.setAttribute("tipoUsuario", usuario.getTipoUsuario());
            request.getSession().setAttribute("idUsuario", idUsuario);

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        }
        return mapping.findForward(salida);
    }

/**
     * Acción llamada por Struts para ejecutar la acción UsuarioAct.
     * Registro de actualizaciones de una entidad.<br>
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward UsuarioAct(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        //Salidas
        final String SALIDA_0 = "usuario";

        String salida = SALIDA_0;        
        Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FUsuario fFUsuario = (FUsuario)form;

            Usuario usuario = (Usuario)s.load(Usuario.class, new Long(fFUsuario.getIdUsuario()));
            
            byte [] pass = (fFUsuario.getContrasena()).getBytes();
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(pass);
            String password =convertToHex(messageDigest.digest());
            
            usuario.setNombreUsuario(fFUsuario.getNombreUsuario());
 
            usuario.setTipoUsuario(fFUsuario.getTipoUsuario());
            usuario.setContrasena(password);
            
             if(usuario.getCoordinacion()!=null){
                request.getSession().setAttribute("idCoordinacion", usuario.getCoordinacion());
                request.setAttribute("idCoordinacion", usuario.getCoordinacion().getIdCoordinacion());
                fFUsuario.setCoordinacion(usuario.getCoordinacion().getIdCoordinacion());
            }
            usuario.setCoordinacion(usuario.getCoordinacion());
            if(usuario.getDepartamento()!=null){
                request.getSession().setAttribute("idDepartamento", usuario.getDepartamento());
                request.setAttribute("idDepartamento", usuario.getDepartamento().getIdDepartamento());
                fFUsuario.setDepartamento(usuario.getDepartamento().getIdDepartamento());
            }
            usuario.setDepartamento(usuario.getDepartamento());
            {Coordinacion coord = (Coordinacion)s.load(Coordinacion.class, fFUsuario.getCoordinacion());
              coord.addToUsuarios(usuario);}

            //Feed for combo listCoordinacion.
            {java.util.List<ve.usb.cohesion.runtime.Pair> list = 
               (java.util.List<ve.usb.cohesion.runtime.Pair>)s.createQuery(
               "select new ve.usb.cohesion.runtime.Pair(nombre, idCoordinacion) " + 
               "from Coordinacion").list();
             list.add(0,new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
             fFUsuario.setListCoordinacion(list);
            }
              
            {Departamento coord = (Departamento)s.load(Departamento.class, fFUsuario.getDepartamento());
              coord.addToUsuarios(usuario);}

            //Feed for combo listDepartamento.
            {java.util.List<ve.usb.cohesion.runtime.Pair> listD = 
               (java.util.List<ve.usb.cohesion.runtime.Pair>)s.createQuery(
               "select new ve.usb.cohesion.runtime.Pair(nombre, idDepartamento) " + 
               "from Departamento").list();
             listD.add(0,new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
             fFUsuario.setListDepartamento(listD);
            }


            //request.getSession().setAttribute("idCoordinacion", fFUsuario.getCoordinacion());
            //request.setAttribute("tipoUsuario", usuario.getTipoUsuario());
            //request.getSession().setAttribute("idUsuario", usuario.getIdUsuario());

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        }
        return mapping.findForward(salida);
    }

/**
     * Acción llamada por Struts para ejecutar la acción UsuarioElim.
     * Elimina la entidad seleccionada.<br>
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward UsuarioElim(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        //Salidas
        final String SALIDA_0 = "CoordinacionI";
        final String SALIDA_1 = "usuario";

        String salida = SALIDA_0;        
        Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            String id = request.getParameter("idUsuario");
            Long idUsuario = (id==null) ? 
                (Long)request.getSession().getAttribute("idUsuario") :
                new Long(id);
            Usuario usuario = (Usuario)s.load(Usuario.class, idUsuario);

            long idCoordinacion = usuario.getCoordinacion().getIdCoordinacion();
            long idDepartamento = usuario.getDepartamento().getIdDepartamento();
            usuario.getCoordinacion().removeFromUsuarios(usuario);
            usuario.getDepartamento().removeFromUsuarios(usuario);
            try {
                s.flush();
                request.getSession().setAttribute("idUsuario", idUsuario);

                request.getSession().setAttribute("idCoordinacion", idCoordinacion);
                request.getSession().setAttribute("idDepartamento", idDepartamento);

            } catch (Exception ex1) {
                ex1.printStackTrace();
                salida = SALIDA_1;
                request.setAttribute("msg", "No se pudo eliminar entidad.");
                request.setAttribute("tipoUsuario", usuario.getTipoUsuario());
            }

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        }
        return mapping.findForward(salida);
    }

/**
     * Acción llamada por Struts para ejecutar la acción UsuarioCrear.
     * Registro de la creación de una usuario.<br>
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    
   private static String convertToHex(byte[] data) {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < data.length; i++) {
        	int halfbyte = (data[i] >>> 4) & 0x0F;
        	int two_halfs = 0;
        	do {
	        	if ((0 <= halfbyte) && (halfbyte <= 9))
	                buf.append((char) ('0' + halfbyte));
	            else
	            	buf.append((char) ('a' + (halfbyte - 10)));
	        	halfbyte = data[i] & 0x0F;
        	} while(two_halfs++ < 1);
        }
        return buf.toString();
    }
    
    
    
    public ActionForward UsuarioCrear(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        //Salidas
        final String SALIDA_1 = "usuario";

        String salida = SALIDA_1;        
        Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            
      
            
            FUsuario fFUsuario = (FUsuario)form;
            
            byte [] pass = (fFUsuario.getContrasena()).getBytes();
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(pass);
       
            String password = convertToHex(messageDigest.digest());
            
          
            Usuario usuario = new Usuario();
            usuario.setNombreUsuario(fFUsuario.getNombreUsuario());
            //usuario.setContrasena(fFUsuario.getContrasena());
            
            //usuario.setContrasena(new String(messageDigest.digest()));
            usuario.setContrasena(password);
            
            usuario.setTipoUsuario(fFUsuario.getTipoUsuario());


            {Coordinacion obj = (Coordinacion)s.load(Coordinacion.class, new Long(fFUsuario.getCoordinacion()));
             obj.addToUsuarios(usuario);
            }
            
            {Departamento obj = (Departamento)s.load(Departamento.class, new Long(fFUsuario.getDepartamento()));
             obj.addToUsuarios(usuario);
            }
            
            s.flush();
            fFUsuario.setIdUsuario(usuario.getIdUsuario());
            //Feed for combo listCoordinacion.
            {java.util.List<ve.usb.cohesion.runtime.Pair> list = 
               (java.util.List<ve.usb.cohesion.runtime.Pair>)s.createQuery(
               "select new ve.usb.cohesion.runtime.Pair(nombre, idCoordinacion) " + 
               "from Coordinacion").list();
             list.add(0,new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
             fFUsuario.setListCoordinacion(list);
            }
            
            {java.util.List<ve.usb.cohesion.runtime.Pair> listD = 
               (java.util.List<ve.usb.cohesion.runtime.Pair>)s.createQuery(
               "select new ve.usb.cohesion.runtime.Pair(nombre, idDepartamento) " + 
               "from Departamento").list();
             listD.add(0,new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
             fFUsuario.setListDepartamento(listD);
            }



            //fFUsuario.setCoordinacion(usuario.getCoordinacion().getIdCoordinacion());
            //request.getSession().setAttribute("idCoordinacion", fFUsuario.getCoordinacion());
            //request.setAttribute("tipoUsuario", usuario.getTipoUsuario());
            //request.getSession().setAttribute("idUsuario", usuario.getIdUsuario());

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        }
        return mapping.findForward(salida);
    }
    
public ActionForward UsuarioLoginI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {  
            
            final String SALIDA_1 = "inicio";

            String salida = SALIDA_1;
            Session s = HibernateUtil.getSessionFactory().getCurrentSession();
            Transaction tr = s.beginTransaction();
            
            try{
                
            HttpSession sess = request.getSession();
            FUsuario fFUsuario = (FUsuario)sess.getAttribute("FUsuario");
                if (fFUsuario==null) {
                    fFUsuario = new FUsuario();
                    sess.setAttribute("FUsuario", fFUsuario);
                    }else {
                        fFUsuario.reset(mapping, request);
                        }
            
            request.getSession().setAttribute("mensaje",null);
            tr.commit();
            
              } 
            catch (Exception ex){
                
                  tr.rollback();
                  throw ex;
                
            }
            return mapping.findForward(salida);
    }

public ActionForward UsuarioLogin(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        //Salidas
        final String SALIDA_0 = "usuario";

        String salida = SALIDA_0;
        
        Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FUsuario fFUsuario = (FUsuario)form;
            byte [] pass = (fFUsuario.getContrasena()).getBytes();
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(pass);
            String password =convertToHex(messageDigest.digest());
            
            String crit = " where nombreUsuario = '" + fFUsuario.getNombreUsuario() + "'";
            java.util.List<Usuario> list = (java.util.List<Usuario>)s.createQuery("from Usuario"+crit).list();
            if(list.size() == 0){
                request.setAttribute("mensaje","Error en Nombre de Usuario o Contrase&ntilde;a ");
                request.getSession().setAttribute("login", false);
                salida = "UsuarioLoginI";
            }else{
                
                //if(list.get(0).getContrasena().equals(fFUsuario.getContrasena())){
                if(list.get(0).getContrasena().equals(password)){
                
                Usuario usuario = (Usuario)s.load(Usuario.class, new Long(list.get(0).getIdUsuario()));
                usuario.setNombreUsuario(fFUsuario.getNombreUsuario());
                //usuario.setContrasena(fFUsuario.getContrasena());
                usuario.setContrasena(password);
                usuario.setTipoUsuario(usuario.getTipoUsuario());
                
                
                
                if(usuario.getCoordinacion()!=null){
                    request.getSession().setAttribute("idCoordinacion", usuario.getCoordinacion());
                    request.setAttribute("idCoordinacion", usuario.getCoordinacion().getIdCoordinacion());
                    fFUsuario.setCoordinacion(usuario.getCoordinacion().getIdCoordinacion());
                    request.getSession().setAttribute("idCoordinacionC", usuario.getCoordinacion().getIdCoordinacion());
                    request.setAttribute("idCoordinacionC", usuario.getCoordinacion().getIdCoordinacion());
                    
                }
                usuario.setCoordinacion(usuario.getCoordinacion());
                if(usuario.getDepartamento()!=null){
                    request.getSession().setAttribute("idDepartamento", usuario.getDepartamento().getIdDepartamento());
                    request.setAttribute("idDepartamento", usuario.getDepartamento().getIdDepartamento());
                    fFUsuario.setDepartamento(usuario.getDepartamento().getIdDepartamento());
                }
                usuario.setDepartamento(usuario.getDepartamento());
                request.getSession().setAttribute("idUsuario", usuario.getIdUsuario());
                request.setAttribute("idUsuario", usuario.getIdUsuario());
                request.getSession().setAttribute("login", true);
                request.getSession().setAttribute("nombreUsuario", usuario.getNombreUsuario());
                request.getSession().setAttribute("tipoUsuario", usuario.getTipoUsuario());
                request.setAttribute("tipoUsuario", usuario.getTipoUsuario());
                request.setAttribute("mensaje","");
                salida = "usuario";
                }
                
           
                else{
                   request.setAttribute("mensaje","Error en Nombre de Usuario o Contrase&ntilde;a ");
                   request.getSession().setAttribute("login", false);
                   fFUsuario.setContrasena("");
                   fFUsuario.setNombreUsuario("");
                   salida = "inicio";
                }
                
            }
            //Feed for combo listCoordinacion.
            {java.util.List<ve.usb.cohesion.runtime.Pair> listC = 
               (java.util.List<ve.usb.cohesion.runtime.Pair>)s.createQuery(
               "select new ve.usb.cohesion.runtime.Pair(nombre, idCoordinacion) " + 
               "from Coordinacion").list();
             listC.add(0,new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
             fFUsuario.setListCoordinacion(listC);
            }
             //Feed for combo listCoordinacion.
            {java.util.List<ve.usb.cohesion.runtime.Pair> listD = 
               (java.util.List<ve.usb.cohesion.runtime.Pair>)s.createQuery(
               "select new ve.usb.cohesion.runtime.Pair(nombre, idDepartamento) " + 
               "from Departamento").list();
             listD.add(0,new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
             fFUsuario.setListDepartamento(listD);
            }
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        }
        return mapping.findForward(salida);
    }
    
     public ActionForward UsuarioLogout(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        final String SALIDA_0 = "UsuarioLoginI";
        String salida = SALIDA_0;        
        Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            request.getSession().setAttribute("idUsuario",null);
            request.getSession().setAttribute("login",null);
            request.getSession().setAttribute("nombreUsuario",null);
            request.getSession().setAttribute("idCoordinacion",null);   
            request.getSession().setAttribute("idDepartamento",null);   
            request.getSession().setAttribute("tipoUsuario",null);

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        }
        return mapping.findForward(salida);
    }



}